package routers

import (
	"ManageServer/conf"
	"ManageServer/defs"
	"ManageServer/lib"
	"ManageServer/utils/logger"
	"github.com/gin-contrib/cors"
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
	"net/http"
	"strings"
	"time"
)

func initRouter() *gin.Engine {
	r := gin.New()
	//默认只在控制台输出日志
	r.Use(gin.Logger())
	//异常处理
	r.Use(lib.Recovery())
	// ReleaseMode  DebugMode  TestMode  不知道有什么区别
	gin.SetMode(gin.ReleaseMode)

	// 加盐，每个项目自动生成
	secret := "6a2720d0-246f-454a-b321-148575de9f7d"

	store := cookie.NewStore([]byte(secret))
	store.Options(sessions.Options{MaxAge: 604800})
	r.Use(sessions.Sessions("sessionid", store))

	// 跨域，使用默认配置
	// config := cors.DefaultConfig()
	// config.AllowAllOrigins = true
	// router.Use(cors.New(config))
	r.Use(cors.Default())

	// 中间件，销毁 gls 内存
	r.Use(lib.CleanGls())

	// 配置前端文件
	// 与配置文件在同一目录下
	r.StaticFS("/web", http.Dir(conf.DirPath+"/build/web"))

	// 路由：api文档配置
	r.StaticFS("/apidoc", http.Dir(conf.DirPath+"/apidoc"))

	routerApiToken := r.Group("/v1.0/api-token", lib.CheckToken())
	defs.RegisterRoutesApiToken(routerApiToken)
	// 注册 API 接口路由
	//中间件，登录验证
	//中间件，权限验证
	routerVersion := r.Group("/v1.0/api", lib.Check(), lib.RouteAuthorization())
	defs.RegisterRoutes(routerVersion)

	return r
}

func Run() {
	// 从配置文件获取端口号
	uri, err := conf.ConfFile.GetValue("gui", "uri")
	if err != nil {
		logger.ErrorLogger.Error(err.Error())
		return
	}
	l := strings.Split(uri, ":")
	port := l[2]

	// 加载路由
	r := initRouter()

	// 启动服务
	server := &http.Server{
		Addr:           ":" + port,
		Handler:        r,
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   100 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}

	go func() {
		err = server.ListenAndServe()
		if err != nil && err != http.ErrServerClosed {
			logger.PanicLogger.Error(err.Error())
		}
	}()
}
